package cn.io1;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class Test07 {
    /*
    *序列化操作
        一个对象要想序列化，必须满足两个条件:
        该类必须实现java.io.Serializable 接口，Serializable 是一个标记接口，
        * 实现此接口的类将不会使任何状态序列化或反序列化，会抛出NotSerializableException 。
        该类的所有属性必须是可序列化的。如果有一个属性不需要可序列化的，则该属性必须注明是瞬态的，使用transient 关键字修饰。
        *
        * 对于JVM可以反序列化对象，它必须是能够找到class文件的类。如果找不到该类的class文件，则抛出一个 ClassNotFoundException 异常。
        *
        * 另外，当JVM反序列化对象时，能找到class文件，但是class文件在序列化对象之后发生了修改，那么反序列化操作也会失败，抛出一个InvalidClassException异常。发生这个异常的原因如下：

        该类的序列版本号与从流中读取的类描述符的版本号不匹配
        该类包含未知数据类型
        该类没有可访问的无参数构造方法
        Serializable 接口给需要序列化的类，提供了一个序列版本号。serialVersionUID 该版本号的目的在于验证序列化的对象和对应类是否版本匹配。
    * */
    public static void main(String[] args) {
        // serializableObject();
        // unSerializableObject();

        // 需求: 现有3个吊毛对象, 并将对象序列化到流中, 随后完成反序列化操作
        // serializableListObject();
        unSerializableListObject();
    }

    private static void unSerializableListObject() {
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("move/employeeList.txt"))){
            List<Employee> list = (List<Employee>)ois.readObject();
            list.forEach(System.out::println);
        } catch (IOException | ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }

    private static void serializableListObject() {
        List<Employee> list = new ArrayList<>();
        list.add(new Employee("吊毛1","福州",99));
        list.add(new Employee("吊毛2","福州",99));
        list.add(new Employee("吊毛3","福州",99));
        try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("move/employeeList.txt"))){
            oos.writeObject(list);
        }catch (IOException e){
            e.printStackTrace();
        }
    }

    private static void unSerializableObject() {
        try(ObjectInputStream ois = new ObjectInputStream(new FileInputStream("move/employee.txt"))){
            Employee employee = (Employee) ois.readObject();
            System.out.println(employee);
        }catch (IOException | ClassNotFoundException e){
            e.printStackTrace();
        }
    }

    private static void serializableObject() {
        Employee employee = new Employee("吊毛","福州",99);
        try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("move/employee.txt"))){
            oos.writeObject(employee);
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}
